package com.engine.jucailinkq.common.cmd;

import com.engine.jucailinkq.attendance.enums.ApplicableOrganizationEnum;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.jucailinkq.common.util.DbTools;
import com.engine.core.interceptor.CommandContext;
import com.engine.jucailinkq.common.util.Utils;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 获得假期modeid下所有适用组织人
 */
@Slf4j
public class GetPersonDateBySuitOrganzation extends AbstractCommonCommand<Map<String,Object>> {
    @Override
    public BizLogContext getLogContext() {
        return null;
    }


    public GetPersonDateBySuitOrganzation(Map<String,Object> params){
        this.params=params;
    }

    @Override
    public Map<String, Object> execute(CommandContext commandContext) {
        String modeId = Util.null2String(params.get("modeId"));
        String sql = "select dxlx,aqjb,dataid,dx from uf_jcl_syzz where modeid=?";
        //假期额度适用组织所有值集合
        List<Map<String,Object>> organzationList = DbTools.getSqlToList(sql,modeId);
        sql = "select a.id dataid,b.id detailid,a.*,b.* from uf_jcl_kq_jqed a left join uf_jcl_kq_jqed_dt1 b on a.id=b.mainid where (gzzt is null or  gzzt <> '1')";
        //所有假期额度生成规则值
        List<Map<String,Object>> vacationList = DbTools.getSqlToList(sql);
        //人力资源id，（假别，规则id）
        Map<String,Object> personMap = Maps.newHashMap();
        //人员分组id，（假别，规则id）
        Map<String,Object> personOrganzationMap = Maps.newHashMap();
        //部门id，（假别，规则id）
        Map<String,Object> departMentMap = Maps.newHashMap();
        //分部id，（假别，规则id）
        Map<String,Object> subCompanyMap = Maps.newHashMap();


        //以假期额度生成规则id分割的假期额度生成规则值集合
        Map<String,String> vacationMap = Maps.newHashMap();
        for (Map<String,Object> vocation:vacationList){
            vacationMap.put(vocation.get("dataid").toString(),vocation.get("jb").toString());
        }


        Map<String,List<Map<String,Object>>> vacationGroupByDataIdMap = vacationList.stream().collect(Collectors.groupingBy(e->e.get("dataid").toString()));


        Set<String> personOrganzationIds = Sets.newHashSet();
        Set<String> departMentIds = Sets.newHashSet();
        Set<String> subCompanyIds = Sets.newHashSet();
        for (Map<String,Object> organzation:organzationList){
            String dx = Util.null2String(organzation.get("dx")).split("-")[0];
            String dataid = Util.null2String(organzation.get("dataid"));
            String jb = vacationMap.get(dataid);
            if (ApplicableOrganizationEnum.PERSONNEL.getKey().equals(organzation.get("dxlx"))){
                Map<String,String> psersonSet = (Map<String,String>)personMap.get(dx);
                if (psersonSet == null){
                    psersonSet = Maps.newHashMap();
                    personMap.put(dx,psersonSet);
                }
                psersonSet.put(jb,dataid);
            }else if (ApplicableOrganizationEnum.PERSONNEL_GROUP.getKey().equals(organzation.get("dxlx"))){
                personOrganzationIds.add(dx);

                Map<String,String> personOrganzationSet = (Map<String,String>)personOrganzationMap.get(dx);
                if (personOrganzationSet == null){
                    personOrganzationSet = Maps.newHashMap();
                    personOrganzationMap.put(dx,personOrganzationSet);
                }
                personOrganzationSet.put(jb,dataid);
            }else if (ApplicableOrganizationEnum.DEPARTMENT.getKey().equals(organzation.get("dxlx"))){
                departMentIds.add(dx);

                Map<String,String> departMentSet = (Map<String,String>)departMentMap.get(dx);
                if (departMentSet == null){
                    departMentSet = Maps.newHashMap();
                    departMentMap.put(dx,departMentSet);
                }
                departMentSet.put(jb,dataid);
            }else if (ApplicableOrganizationEnum.SUBCOMPANY.getKey().equals(organzation.get("dxlx"))){
                subCompanyIds.add(dx);

                Map<String,String> subCompanySet = (Map<String,String>)subCompanyMap.get(dx);
                if (subCompanySet == null){
                    subCompanySet = Maps.newHashMap();
                    subCompanyMap.put(dx,subCompanySet);
                }
                subCompanySet.put(jb,dataid);
            }
        }
        sql = "select id,departmentid,subcompanyid1,seclevel from hrmresource where 1=1";
        if (departMentIds.size() > 0){
            sql = sql+ " and departmentid in ("+String.join(",",departMentIds)+")";
        }
        if (subCompanyIds .size() >0 && departMentIds.size() > 0){
            sql = sql+ " or subcompanyid1 in ("+String.join(",",subCompanyIds)+")";
        }else if (subCompanyIds .size() >0 && departMentIds.size() == 0){
            sql = sql+ " and subcompanyid1 in ("+String.join(",",subCompanyIds)+")";
        }


        List<Map<String,Object>> hrmListByDepartAndSubCompanyIds = DbTools.getSqlToList(sql);
        //部门id-人员id集合
        Map<String,List<Map<String,Object>>> hrmListGroupByDepart = hrmListByDepartAndSubCompanyIds.stream().collect(Collectors.groupingBy(e->Util.null2String(e.get("departmentid"))));
        log.info("hrmListGroupByDepart : [{}]",hrmListGroupByDepart);
        //分部id-人员id集合
        Map<String,List<Map<String,Object>>> hrmListGroupBySubCompany = hrmListByDepartAndSubCompanyIds.stream().collect(Collectors.groupingBy(e->Util.null2String(e.get("subcompanyid1"))));
        log.info("hrmListGroupBySubCompany : [{}]",hrmListGroupBySubCompany);
        //人员分组id-人员id集合
        if (personOrganzationIds.size() >0){
            //人员分组id-（假别，假期规则id）
            Map<String,Set<String>> personGroupUserIds = getPersonGroupUserIds(personOrganzationIds);
            log.info("personGroupUserIds : [{}]",personGroupUserIds);
            log.info("personOrganzationMap : [{}]",personOrganzationMap);
            for (Map.Entry<String,Object> entry : personOrganzationMap.entrySet()){
                String personGroupId = entry.getKey();
                //人员分组（假别，假期规则id）
                Map<String,String> personGroupHolidayMap = (Map<String,String>)entry.getValue();
                Set<String> userIds = personGroupUserIds.get(personGroupId);
                for (String userId :userIds){
                    //人力资源原本已有的假期，（假别，规则id）
                    Map<String,String> psersonSet = personMap.get(userId) == null?null:(Map<String,String>)personMap.get(userId);
                    if (psersonSet == null) {
                        personMap.put(userId,personGroupHolidayMap);
                    }else {
                        for (Map.Entry<String,String> personGroupHolidayEntry :personGroupHolidayMap.entrySet()){
                            if (psersonSet.get(personGroupHolidayEntry.getKey()) == null){
                                psersonSet.put(personGroupHolidayEntry.getKey(),personGroupHolidayEntry.getValue());
                            }
                        }
                        personMap.put(userId,psersonSet);
                    }
                }
            }
        }

        log.info("before personMap : [{}]",personMap);
        //部门id
        log.info("departMentMap : [{}]",departMentMap);
        for (Map.Entry<String,Object> entry : departMentMap.entrySet()){
            String departMentId = entry.getKey();
            //部门（假别，假期规则id）
            Map<String,String> departMentHolidayMap = (Map<String,String>)entry.getValue();
            List<Map<String,Object>> userIds = hrmListGroupByDepart.get(departMentId);
            for (Map<String,Object> userIdMap :userIds){
                //人力资源原本已有的假期，（假别，规则id）
                String userId = Util.null2String(userIdMap.get("id"));
                Map<String,String> psersonSet = personMap.get(userId) == null?null:(Map<String,String>)personMap.get(userId);
                if (psersonSet == null) {
                    personMap.put(userId,departMentHolidayMap);
                }else {
                    for (Map.Entry<String,String> personGroupHolidayEntry :departMentHolidayMap.entrySet()){
                        if (psersonSet.get(personGroupHolidayEntry.getKey()) == null){
                            psersonSet.put(personGroupHolidayEntry.getKey(),personGroupHolidayEntry.getValue());
                        }
                    }
                    personMap.put(userId,psersonSet);
                }
            }
        }
        //分部id
        log.info("subCompanyMap : [{}]",subCompanyMap);
        for (Map.Entry<String,Object> entry : subCompanyMap.entrySet()){
            String subCompanyId = entry.getKey();
            //分部（假别，假期规则id）
            Map<String,String> subCompanyHolidayMap = (Map<String,String>)entry.getValue();
            List<Map<String,Object>> userIds = hrmListGroupBySubCompany.get(subCompanyId);
            for (Map<String,Object> userIdMap :userIds){
                //人力资源原本已有的假期，（假别，规则id）
                String userId = Util.null2String(userIdMap.get("id"));
                Map<String,String> psersonSet = personMap.get(userId) == null?null:(Map<String,String>)personMap.get(userId);
                if (psersonSet == null) {
                    personMap.put(userId,subCompanyHolidayMap);
                }else {
                    for (Map.Entry<String,String> personGroupHolidayEntry :subCompanyHolidayMap.entrySet()){
                        if (psersonSet.get(personGroupHolidayEntry.getKey()) == null){
                            psersonSet.put(personGroupHolidayEntry.getKey(),personGroupHolidayEntry.getValue());
                        }
                    }
                    personMap.put(userId,psersonSet);
                }
            }
        }
        log.info("personMap : [{}]",personMap);
        Map<String,Object> newpersonMap = Maps.newHashMap();
        for (Map.Entry<String,Object> entry :personMap.entrySet()){
            String userId = entry.getKey();
            Map<String, String> vocationMap = (Map<String, String>)entry.getValue();
            Map<String,Object> dataMap = Maps.newHashMap();
            for (Map.Entry<String,String> vocationEntry :vocationMap.entrySet()){
                String jb = vocationEntry.getKey();
                String dataId = vocationEntry.getValue();
                if (jb != null && !"".equals(jb) && vacationGroupByDataIdMap.get(dataId) !=null){
                    dataMap.put(jb,vacationGroupByDataIdMap.get(dataId));
                }
            }
            newpersonMap.put(userId,dataMap);
        }
        return newpersonMap;
    }

    /**
     * 获得人员分组下面的人员集合
     * @param personOrganzationIds
     * @return人员分组id-人员id集合
     */
    public Map<String,Set<String>> getPersonGroupUserIds(Set<String> personOrganzationIds){
        String sql = "select b.mainid,b.empid,b.filters,b.sqltj,b.bdate,b.edate,a.list_type from uf_ryqz a left join uf_ryqz_dt1 b on a.id=b.mainid where  mainid in ("+String.join(",",personOrganzationIds)+")";

        List<Map<String,Object>> personGroupDataList = DbTools.getSqlToList(sql);

        Map<String,Set<String>> personGroupUserIds = Maps.newHashMap();
        for (Map<String,Object> personGroupData :personGroupDataList){
            String id = Util.null2String(personGroupData.get("mainid"));
            String empid = Util.null2String(personGroupData.get("empid"));
            String filters = Util.null2String(personGroupData.get("filters"));
            String list_type = Util.null2String(personGroupData.get("list_type"));
            String sqltj = Util.null2String(personGroupData.get("sqltj"));

            Set<String> userIds = personGroupUserIds.get(id);
            if (userIds == null){
                userIds = Sets.newHashSet();
                personGroupUserIds.put(id,userIds);
            }

            if ("0".equals(list_type) && !"".equals(empid)){
                //人员清单
                userIds.add(empid);

            }else if ("1".equals(list_type) && !"".equals(filters)){
                //条件清单
                sql = "select id,seclevel from hrmresource where 1=1 ";
                filters = filters.replace("ａｎｄ","and");
                filters = filters.replace("ｏｒ","or");
                if (filters.contains("field")){
                    sql = "select a.id,a.seclevel from hrmresource a left join cus_fielddata b on a.id=b.id where scope='HrmCustomFieldByInfoType'  and "+filters;
                }else {
                    sql = sql+ " and "+filters;
                }
                log.info("getPersonnelGroupingByPerson filter sql : {}",sql);
                List<Map<String,Object>> dataList = DbTools.getSqlToList(sql);
                for (Map<String,Object> dataMap :dataList){
                    String hrmId = Util.null2String(dataMap.get("id"));
                    String seclevel = Util.null2String(dataMap.get("seclevel"));
                    userIds.add(hrmId);
                }
            }else if ("2".equals(list_type) && !"".equals(sqltj)){
                sqltj = Utils.converSQL(sqltj);
                log.debug("getPersonnelGroupingByPerson sqltj : [{}]",sqltj);
                List<Map<String,Object>> dataList = DbTools.getSqlToList(sqltj);
                for (Map<String,Object> dataMap :dataList){
                    String hrmId = Util.null2String(dataMap.get("id"));
                    userIds.add(hrmId);
                }
            }
        }

        return personGroupUserIds;
    }
}
